// font_manager.cpp
#include "font_manager.h"
#include <iostream>
#include <vector>
#include <set>

// 静态变量：仅在本文件内可见
static unsigned char* g_font_file_data = nullptr;  // 字体文件数据
static int g_font_file_size = 0;                   // 字体文件大小
static bool g_font_loaded = false;                 // 标记是否成功加载
static Font g_font;                                // 全局字体对象

bool LoadGlobalFont() {
    // 加载阿里巴巴普惠体字体文件内容（从项目 assets 目录）
    TraceLog(LOG_INFO, "尝试加载字体文件: assets/fonts/AlibabaPuHuiTi-2-55-Regular.ttf");
    
    g_font_file_data = LoadFileData("assets/fonts/AlibabaPuHuiTi-2-55-Regular.ttf", &g_font_file_size);
    
    if (g_font_file_data == nullptr) {
        TraceLog(LOG_ERROR, "字体文件加载失败，使用默认字体（中文将乱码）");
        g_font_loaded = false;
        return false;
    }

    TraceLog(LOG_INFO, "字体文件加载成功，大小: %d 字节", g_font_file_size);

    // 定义常用中文字体字符集
    const char* commonChars = "欢迎来到美丽的新世界你好板子向上移动1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ，。！？；：\"'（）【】《》、-=+*/\\[]{}|~`@#$%^&()_";
    
    // 将字符串中的字符逐一转换成Unicode码点，得到码点表
    int codepointsCount;
    int* codepoints = LoadCodepoints(commonChars, &codepointsCount);
    
    if (codepoints == nullptr || codepointsCount == 0) {
        TraceLog(LOG_ERROR, "无法解析常用字符集，加载失败");
        UnloadFileData(g_font_file_data);
        g_font_file_data = nullptr;
        g_font_file_size = 0;
        g_font_loaded = false;
        return false;
    }

    TraceLog(LOG_INFO, "成功解析字符集，字符数: %d", codepointsCount);

    // 预加载字体对象，包含常用中文字体
    const int defaultFontSize = 32;
    g_font = LoadFontFromMemory(".ttf", g_font_file_data, g_font_file_size, defaultFontSize, codepoints, codepointsCount);
    
    // 释放码点表
    UnloadCodepoints(codepoints);
    
    g_font_loaded = true;
    TraceLog(LOG_INFO, "字体文件加载成功！文件大小: %d 字节，预加载字符数: %d", g_font_file_size, codepointsCount);
    
    // 设置字体纹理过滤方式：BILINEAR（平滑，适合中文字体）
    SetTextureFilter(g_font.texture, TEXTURE_FILTER_BILINEAR);

    return true;
}

void UnloadGlobalFont() {
    // 卸载字体文件数据
    if (g_font_loaded && g_font_file_data != nullptr) {
        UnloadFont(g_font);
        UnloadFileData(g_font_file_data);
        g_font_file_data = nullptr;
        g_font_file_size = 0;
        g_font_loaded = false;
        TraceLog(LOG_INFO, "字体文件数据已卸载");
    }
}

void DrawTextCN(const char* text, int x, int y, int fontSize, Color color) {
    // 只有在字体文件成功加载的情况下才绘制文本
    if (!g_font_loaded || g_font_file_data == nullptr) {
        // 如果字体未加载，则使用默认字体绘制（可能会出现乱码）
        TraceLog(LOG_WARNING, "字体未加载，使用默认字体绘制文本: %s", text);
        DrawText(text, x, y, fontSize, color);
        return;
    }
    
    // 使用预加载字体绘制所有文本，不区分字体大小
    TraceLog(LOG_INFO, "使用预加载字体绘制文本: %s", text);
    Vector2 pos = { (float)x, (float)y };
    float spacing = (float)fontSize / 10.0f;
    DrawTextEx(g_font, text, pos, (float)fontSize, spacing, color);
}